package com.bingo.sds.algorithm;

import java.util.Collection;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

public class PreciseShardingAlgorithm_String implements PreciseShardingAlgorithm<String> {
	/**
	 * @param availableTargetNames 分表策略指定的所有真实表名称集合
	 * @param shardingValue 分片键的值
	 * @return 分片键对应的真实表名称
	 */
	@Override
	public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
		// 所有的真实表数量
		int tableTotalNum = availableTargetNames.size();
		// 分片键的值
		String value = shardingValue.getValue();
		// 真实表的名称
		String tableRealName = null;
		// 真实表名称后缀
		String tableRealNameSuffix = "0";
		
		if(value != null) {
			// 根据分片键字符串值的哈希码计算出真实表的后缀序号
			tableRealNameSuffix = "" + Math.abs(value.hashCode() % tableTotalNum);
		}
		
		// 对所有真实表进行后缀匹配找到对应的真实表名称
		for(String tbRealName : availableTargetNames) {
			if(tbRealName.endsWith(tableRealNameSuffix)) {
				tableRealName = tbRealName;
				break;
			}
		}
		
		return tableRealName;
	}
}
